package com.demo.test.juc.Atomic;

import org.junit.Test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 通过加锁解决原子性问题
 * 1.1、Lock接口
 * 1.2、synchronized关键字
 * @author gy
 * @date 2023/3/26
 */
public class IaddTest1 {
    public int i = 0;
    private Lock lock = new ReentrantLock(false);

    /**
     * 分别在i++的前后进行加锁和解锁，实现i++的原子操作。
     */
//    public void add(){
//        try{
//            lock.lock();	//加锁
//            i++;
//        }catch (Exception e){
//            e.printStackTrace();
//        }finally {
//            lock.unlock();	//解锁
//        }
//
//    }

    //    public synchronized void add()    //给add方法加锁
    public void add(){
        synchronized (this){            //给i++加锁
            i++;
        }
    }

    @Test
    public void m1() throws InterruptedException {
        IaddTest1 IaddTest1 = new IaddTest1();

        for(int i=0;i<2;i++){       //创建两个线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for(int i=0;i<10000;i++){
                        IaddTest1.add();
                    }
                }
            }).start();
        }

        Thread.sleep(2000L);//sleep两秒，等待两个线程任务全部执行完成
        System.out.println("i:" + IaddTest1.i);
    }
}
